#ifndef __GfxDriver_Shader_h__
#define __GfxDriver_Shader_h__

#include "Core/BasicTypes.h"

namespace Orca {

	class Texture;

	//--------------------------------------------------------------------------
	class VertexProgram {

	public:
		virtual ~VertexProgram() {}

		virtual unsigned int getAPIHandle() = 0;

	};

	//--------------------------------------------------------------------------
	class FragmentProgram {
	
	public:
		virtual ~FragmentProgram() {}

		virtual unsigned int getAPIHandle() = 0;
	};

	//--------------------------------------------------------------------------
	class Shader {

	public:
		virtual ~Shader() {}

		virtual void beginRender() = 0;
		virtual void endRender() = 0;

		virtual void beginBinding() = 0;
		virtual void endBinding() = 0;

		virtual void bindFloat(const Str &name, float val) = 0;
		virtual void bindVec2(const Str &name, const vec2 &val) = 0;
		virtual void bindVec3(const Str &name, const vec3 &val) = 0;
		virtual void bindVec4(const Str &name, const vec4 &val) = 0;
		virtual void bindMtx4(const Str &name, const mtx44 &val) = 0;

		virtual void bindFloatArray(const Str &name, const float *val, uint32 cnt) = 0;
		virtual void bindVec2Array(const Str &name, const vec2 *val, uint32 cnt) = 0;
		virtual void bindVec3Array(const Str &name, const vec3 *val, uint32 cnt) = 0;
		virtual void bindVec4Array(const Str &name, const vec4 *val, uint32 cnt) = 0;
		virtual void bindMtx4Array(const Str &name, const mtx44 *val, uint32 cnt) = 0;

		virtual void bindTexture(const Str &name, Texture *tex) = 0;
	};

}

#endif	// __GfxDriver_Shader_h__